Data prep
Score distributions
First, let’s look at the distributions of scores for all scales, pre- and post-test:

It looks like there’s a lot of overlap in the pre- and post-test distrubtions for all scales - though a few hints of subtle shifts (e.g., in diseaseRare, vaccIntent).
Visual comparison of pre- vs. post-intervention
Let’s compare participants’ responses pre- vs. post-intervention on all scales. I’ll plot both mean pre- and post-intervention scores, as well as mean difference scores (note separate axes):


Scale for 'y' is already present. Adding another scale for 'y', which will
replace the existing scale.
Scale for 'colour' is already present. Adding another scale for 'colour',
which will replace the existing scale.

Some interesting things might be going on here! Probably most useful paired with some actual stats…
Regression analyses
First, let’s choose how to code our data - I’ve set up contrast coding, effect coding and dummy coding options here, and I’ll go with dummy-coding for now (with noInterv and pre as the baselines for comparison for condition and phase, respectively).
DR_none
noInterv 0
diseaseRisk 1
post_pre
pre 0
post 1
By scale
This is rather crazy (and of course exploratory) endeavor, and very vulnerable to multiple comparisons… but let’s look at the effects on all scales individually.
Beliefs about vaccines
Intentions to vaccinate (vaccIntent)
NOTE: This is our main DV of interest.
Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
Data: d_scored %>% filter(scale == "vaccIntent")
REML criterion at convergence: 2556
Scaled residuals:
Min 1Q Median 3Q Max
-2.85092 -0.39910 0.07441 0.35054 2.56529
Random effects:
Groups Name Variance Std.Dev.
workerId (Intercept) 1.3847 1.1768
Residual 0.2012 0.4485
Number of obs: 986, groups: workerId, 493
Fixed effects:
Estimate Std. Error t value
(Intercept) 1.56052 0.08250 18.915
phasepost_pre -0.02918 0.04155 -0.702
conditionDR_none -0.02975 0.11360 -0.262
phasepost_pre:conditionDR_none 0.15303 0.05722 2.674
Correlation of Fixed Effects:
(Intr) phsps_ cndDR_
phasepst_pr -0.252
condtnDR_nn -0.726 0.183
phspst_:DR_ 0.183 -0.726 -0.252
Success! In the form of a significant interaction between phase and condition (phasepost_pre:conditionDR_none: change from pre- to post-intervention in the Disease Risk vs. No Intervention conditions).
An analysis with change scores (a la Horne, Powell, et al. (2015, PNAS)):
Call:
lm(formula = diff ~ condition, data = d_scored %>% filter(scale ==
"vaccIntent") %>% spread(phase, mean) %>% mutate(diff = post -
pre))
Residuals:
Min 1Q Median 3Q Max
-2.3239 -0.3239 -0.1239 0.2292 2.4292
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.02918 0.04155 -0.702 0.48280
conditionDR_none 0.15303 0.05722 2.674 0.00773 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.6343 on 491 degrees of freedom
Multiple R-squared: 0.01436, Adjusted R-squared: 0.01235
F-statistic: 7.153 on 1 and 491 DF, p-value: 0.007734
Again, success!
Here’s the relevant plot from the PNAS paper:

Vaccine danger (vaccDanger)
Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
Data: d_scored %>% filter(scale == "vaccDanger")
REML criterion at convergence: 2093.5
Scaled residuals:
Min 1Q Median 3Q Max
-3.2083 -0.4591 0.0028 0.4205 3.4583
Random effects:
Groups Name Variance Std.Dev.
workerId (Intercept) 1.0471 1.0233
Residual 0.1059 0.3254
Number of obs: 986, groups: workerId, 493
Fixed effects:
Estimate Std. Error t value
(Intercept) -1.03519 0.07035 -14.716
phasepost_pre -0.01631 0.03015 -0.541
conditionDR_none 0.07442 0.09687 0.768
phasepost_pre:conditionDR_none -0.15292 0.04151 -3.684
Correlation of Fixed Effects:
(Intr) phsps_ cndDR_
phasepst_pr -0.214
condtnDR_nn -0.726 0.156
phspst_:DR_ 0.156 -0.726 -0.214
Vaccine efficacy (vaccEff)
Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
Data: d_scored %>% filter(scale == "vaccEff")
REML criterion at convergence: 2116.6
Scaled residuals:
Min 1Q Median 3Q Max
-3.8279 -0.4203 0.0566 0.4337 3.0855
Random effects:
Groups Name Variance Std.Dev.
workerId (Intercept) 0.7794 0.8828
Residual 0.1435 0.3788
Number of obs: 986, groups: workerId, 493
Fixed effects:
Estimate Std. Error t value
(Intercept) 0.42060 0.06293 6.683
phasepost_pre 0.05408 0.03509 1.541
conditionDR_none -0.04291 0.08666 -0.495
phasepost_pre:conditionDR_none 0.12746 0.04832 2.638
Correlation of Fixed Effects:
(Intr) phsps_ cndDR_
phasepst_pr -0.279
condtnDR_nn -0.726 0.202
phspst_:DR_ 0.202 -0.726 -0.279
Vaccines’ tendency to strain the infant immune system (vaccStrain)
Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
Data: d_scored %>% filter(scale == "vaccStrain")
REML criterion at convergence: 2682
Scaled residuals:
Min 1Q Median 3Q Max
-2.8991 -0.4107 -0.0029 0.4120 3.4686
Random effects:
Groups Name Variance Std.Dev.
workerId (Intercept) 1.2621 1.1234
Residual 0.2759 0.5252
Number of obs: 986, groups: workerId, 493
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.57167 0.08124 -7.036
phasepost_pre 0.07811 0.04866 1.605
conditionDR_none 0.05090 0.11187 0.455
phasepost_pre:conditionDR_none -0.17657 0.06701 -2.635
Correlation of Fixed Effects:
(Intr) phsps_ cndDR_
phasepst_pr -0.299
condtnDR_nn -0.726 0.217
phspst_:DR_ 0.217 -0.726 -0.299
Vaccine toxicity (vaccTox)
Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
Data: d_scored %>% filter(scale == "vaccTox")
REML criterion at convergence: 2386.2
Scaled residuals:
Min 1Q Median 3Q Max
-2.91670 -0.40646 -0.03804 0.40448 2.94732
Random effects:
Groups Name Variance Std.Dev.
workerId (Intercept) 1.250 1.1180
Residual 0.159 0.3988
Number of obs: 986, groups: workerId, 493
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.228326 0.077765 -2.936
phasepost_pre -0.048927 0.036948 -1.324
conditionDR_none 0.014480 0.107083 0.135
phasepost_pre:conditionDR_none -0.008765 0.050878 -0.172
Correlation of Fixed Effects:
(Intr) phsps_ cndDR_
phasepst_pr -0.238
condtnDR_nn -0.726 0.173
phspst_:DR_ 0.173 -0.726 -0.238
Beliefs about diseases
Disease severity (diseaseSevere)
NOTE: This is the scale that we thought the Disease Risk intervention should affect most directly.
Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
Data: d_scored %>% filter(scale == "diseaseSevere")
REML criterion at convergence: 2398.5
Scaled residuals:
Min 1Q Median 3Q Max
-3.7530 -0.3823 0.0517 0.4004 2.6982
Random effects:
Groups Name Variance Std.Dev.
workerId (Intercept) 0.7094 0.8423
Residual 0.2585 0.5084
Number of obs: 986, groups: workerId, 493
Fixed effects:
Estimate Std. Error t value
(Intercept) 1.84721 0.06445 28.659
phasepost_pre -0.00515 0.04711 -0.109
conditionDR_none -0.06721 0.08875 -0.757
phasepost_pre:conditionDR_none 0.32515 0.06486 5.013
Correlation of Fixed Effects:
(Intr) phsps_ cndDR_
phasepst_pr -0.365
condtnDR_nn -0.726 0.265
phspst_:DR_ 0.265 -0.726 -0.365
Disease rarity (diseaseRare)
Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
Data: d_scored %>% filter(scale == "diseaseRare")
REML criterion at convergence: 2603.9
Scaled residuals:
Min 1Q Median 3Q Max
-2.9595 -0.4748 -0.0016 0.4434 3.6064
Random effects:
Groups Name Variance Std.Dev.
workerId (Intercept) 0.7478 0.8648
Residual 0.3558 0.5965
Number of obs: 986, groups: workerId, 493
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.96223 0.06882 -13.981
phasepost_pre -0.08326 0.05527 -1.507
conditionDR_none -0.18238 0.09477 -1.924
phasepost_pre:conditionDR_none -0.17828 0.07610 -2.343
Correlation of Fixed Effects:
(Intr) phsps_ cndDR_
phasepst_pr -0.402
condtnDR_nn -0.726 0.292
phspst_:DR_ 0.292 -0.726 -0.402
Beliefs about infants’ immune systems
Limited capacity of infants’ immune systems (infantImmLimCap)
Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
Data: d_scored %>% filter(scale == "infantImmLimCap")
REML criterion at convergence: 2759.8
Scaled residuals:
Min 1Q Median 3Q Max
-3.5529 -0.3988 -0.0115 0.4562 3.7260
Random effects:
Groups Name Variance Std.Dev.
workerId (Intercept) 0.9137 0.9559
Residual 0.4054 0.6367
Number of obs: 986, groups: workerId, 493
Fixed effects:
Estimate Std. Error t value
(Intercept) 0.41373 0.07524 5.499
phasepost_pre -0.03433 0.05899 -0.582
conditionDR_none 0.07857 0.10361 0.758
phasepost_pre:conditionDR_none 0.11433 0.08123 1.408
Correlation of Fixed Effects:
(Intr) phsps_ cndDR_
phasepst_pr -0.392
condtnDR_nn -0.726 0.285
phspst_:DR_ 0.285 -0.726 -0.392
Weakness of infants’ immune systems (infantImmWeak)
Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
Data: d_scored %>% filter(scale == "infantImmWeak")
REML criterion at convergence: 2785.1
Scaled residuals:
Min 1Q Median 3Q Max
-2.56604 -0.47750 -0.00131 0.45358 2.41157
Random effects:
Groups Name Variance Std.Dev.
workerId (Intercept) 1.0021 1.001
Residual 0.3969 0.630
Number of obs: 986, groups: workerId, 493
Fixed effects:
Estimate Std. Error t value
(Intercept) 0.29013 0.07749 3.744
phasepost_pre -0.04549 0.05837 -0.779
conditionDR_none 0.10449 0.10670 0.979
phasepost_pre:conditionDR_none 0.04242 0.08037 0.528
Correlation of Fixed Effects:
(Intr) phsps_ cndDR_
phasepst_pr -0.377
condtnDR_nn -0.726 0.274
phspst_:DR_ 0.274 -0.726 -0.377
Other beliefs, attitudes, and worldviews
Medical skepticism (medSkept)
Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
Data: d_scored %>% filter(scale == "medSkept")
REML criterion at convergence: 2453.1
Scaled residuals:
Min 1Q Median 3Q Max
-3.10928 -0.43517 -0.02145 0.42521 3.09386
Random effects:
Groups Name Variance Std.Dev.
workerId (Intercept) 1.1431 1.0692
Residual 0.1953 0.4419
Number of obs: 986, groups: workerId, 493
Fixed effects:
Estimate Std. Error t value
(Intercept) 0.05007 0.07579 0.661
phasepost_pre -0.04220 0.04094 -1.031
conditionDR_none 0.05634 0.10436 0.540
phasepost_pre:conditionDR_none -0.11677 0.05638 -2.071
Correlation of Fixed Effects:
(Intr) phsps_ cndDR_
phasepst_pr -0.270
condtnDR_nn -0.726 0.196
phspst_:DR_ 0.196 -0.726 -0.270
Holistic balance (hb)
Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
Data: d_scored %>% filter(scale == "hb")
REML criterion at convergence: 2407.1
Scaled residuals:
Min 1Q Median 3Q Max
-2.53977 -0.42672 0.03449 0.46098 2.53965
Random effects:
Groups Name Variance Std.Dev.
workerId (Intercept) 1.0026 1.0013
Residual 0.2001 0.4473
Number of obs: 986, groups: workerId, 493
Fixed effects:
Estimate Std. Error t value
(Intercept) 0.22232 0.07185 3.094
phasepost_pre -0.01545 0.04144 -0.373
conditionDR_none 0.00999 0.09893 0.101
phasepost_pre:conditionDR_none -0.11840 0.05707 -2.075
Correlation of Fixed Effects:
(Intr) phsps_ cndDR_
phasepst_pr -0.288
condtnDR_nn -0.726 0.209
phspst_:DR_ 0.209 -0.726 -0.288
Naturalism (nat)
Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
Data: d_scored %>% filter(scale == "nat")
REML criterion at convergence: 2450.2
Scaled residuals:
Min 1Q Median 3Q Max
-3.0499 -0.4451 0.0037 0.4351 3.3838
Random effects:
Groups Name Variance Std.Dev.
workerId (Intercept) 1.0731 1.0359
Residual 0.2049 0.4526
Number of obs: 986, groups: workerId, 493
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.34335 0.07406 -4.636
phasepost_pre -0.03004 0.04194 -0.716
conditionDR_none 0.02027 0.10198 0.199
phasepost_pre:conditionDR_none -0.05778 0.05775 -1.001
Correlation of Fixed Effects:
(Intr) phsps_ cndDR_
phasepst_pr -0.283
condtnDR_nn -0.726 0.206
phspst_:DR_ 0.206 -0.726 -0.283
Overparenting (overpar)
Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
Data: d_scored %>% filter(scale == "overpar")
REML criterion at convergence: 2593.6
Scaled residuals:
Min 1Q Median 3Q Max
-3.15393 -0.47665 -0.06009 0.45377 2.49500
Random effects:
Groups Name Variance Std.Dev.
workerId (Intercept) 0.7761 0.8810
Residual 0.3408 0.5837
Number of obs: 986, groups: workerId, 493
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.015451 0.069235 -0.223
phasepost_pre -0.019742 0.054083 -0.365
conditionDR_none -0.001472 0.095338 -0.015
phasepost_pre:conditionDR_none 0.284358 0.074473 3.818
Correlation of Fixed Effects:
(Intr) phsps_ cndDR_
phasepst_pr -0.391
condtnDR_nn -0.726 0.284
phspst_:DR_ 0.284 -0.726 -0.391
Parental Expertise (parentExpert)
Linear mixed model fit by REML ['lmerMod']
Formula: mean ~ phase * condition + (1 | workerId)
Data: d_scored %>% filter(scale == "parentExpert")
REML criterion at convergence: 2446
Scaled residuals:
Min 1Q Median 3Q Max
-3.2300 -0.4653 -0.0184 0.4962 3.0384
Random effects:
Groups Name Variance Std.Dev.
workerId (Intercept) 1.2031 1.0969
Residual 0.1844 0.4294
Number of obs: 986, groups: workerId, 493
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.49356 0.07717 -6.396
phasepost_pre 0.01459 0.03978 0.367
conditionDR_none 0.01741 0.10626 0.164
phasepost_pre:conditionDR_none -0.10613 0.05478 -1.937
Correlation of Fixed Effects:
(Intr) phsps_ cndDR_
phasepst_pr -0.258
condtnDR_nn -0.726 0.187
phspst_:DR_ 0.187 -0.726 -0.258
Other stuff
Violin plots
With violin plots, we can see the full distribution of scores at each time point in each condition:

Derek’s analyses
DATE: March 13, 2018 3:52 PM
I’m going to pick up here and do some further regression analyses. I’ll look at this data in the way I wish we’d looked at the original PNAS data.
That is, (1) using an ordinal HLM regression over the five separate scale items (conceptually, I think, similar to SEM-style approaches), and (2) using beta regression.
There are two general model forms that I think are reasonable for looking at this. First:
response ~ phase * condition
Kara already tried this general approach, saving the model as r1_vaccIntent. So the only difference here will be the distributions I use. In this case, the interaction term is required, and the real thing to test is the phase*condition interaction.
And second:
post_response ~ pre_response * condition
Here pre_response could be the response on the overall pre-test scale, or the individual items. In addition, the interaction terms are optional, as warranted by the data. I’d wager this is the more familiar approach for most psychologists.
Ordinal HLM
Predicting “response”
Predicting post-test
Here pre is the specific item pre-test score and preMean is the mean of the scale at pretest.
Regression on scale averages
Recall, Kara already looked at a normal regression on responses with r1_vaccIntent model.
Normal regression: predicting post-test
diseaseRisk
noInterv 0
diseaseRisk 1
Beta regression: response
A beta regression on the responses accords with the linear regression on responses–slight positive effect of diseaseRisk, slight negative effect of autism correction, but too much uncertainty overall.
But, our response variable isn’t really all that appropriate for a linear regression, even if many researchers would be happy with that results and move on. Instead, vaccIntent is bounded and highly skewed. That makes it suitable for beta regression.
Error in as.vector(res) : object 'res' not found
Beta regresstion: posttest
Let’s look at predicting post-test with beta regression. Here there’s no evidence at all for any positive effect of diseaseRisk (in fact the coefficient is negative), but there is evidence of BACKFIRE for the autism correction condition.
Call:
betareg(formula = post ~ scale(pre) * condition, data = d2 %>% mutate(post = rescale_beta(post,
-3, 3)))
Standardized weighted residuals 2:
Min 1Q Median 3Q Max
-7.4139 -0.6774 -0.2381 0.6395 4.6225
Coefficients (mean model with logit link):
Estimate Std. Error z value Pr(>|z|)
(Intercept) 1.38527 0.05396 25.674 <2e-16 ***
scale(pre) 1.17727 0.05586 21.073 <2e-16 ***
conditiondiseaseRisk 0.15757 0.07167 2.198 0.0279 *
scale(pre):conditiondiseaseRisk -0.06144 0.07196 -0.854 0.3932
Phi coefficients (precision model with identity link):
Estimate Std. Error z value Pr(>|z|)
(phi) 8.6048 0.5632 15.28 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Type of estimator: ML (maximum likelihood)
Log-likelihood: 583.5 on 5 Df
Pseudo R-squared: 0.5531
Number of iterations: 12 (BFGS) + 3 (Fisher scoring)
AIC favors the beta regression over the linear regression strongly.
[1] -864.451
[1] -1157.006

LS0tCnRpdGxlOiAnVmFjY2luZXM6IE1hbnkgQmVsaWVmcyBTdHVkeSAzOiBBbmFseXNpcycKYXV0aG9yOiAiRGVyZWsgUG93ZWxsLCBLYXJhIFdlaXNtYW4iCmRhdGU6ICIyMDE4LTA1LTAxIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkKYGBgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZ9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHBzeWNoKQojIGxpYnJhcnkoZ2djb3JycGxvdCkKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGJybXMpCmxpYnJhcnkocm1zKQpgYGAKCiMgRGF0YSBwcmVwCgpgYGB7ciB0aWR5LCBpbmNsdWRlID0gRn0KIyBsb2FkIGRhdGEKZF9hbGwgPC0gcmVhZC5jc3YoIi4uL3N0dWR5My9kYXRhL3N0dWR5M19kYXRhLmNzdiIpWy0xXQoKIyByZWZvcm1hdCB0byBtYXRjaCBwcmV2aW91cyBhbmFseXNlcyAoaS5lLiwgMiByb3dzIHBlciBwYXJ0aWNpcGFudCkKZF9kZW1vIDwtIGRfYWxsICU+JSAKICBzZWxlY3Qod29ya2VySWQsIGNvbmRpdGlvbiwgZ2VuZGVyLCBhZ2UsIGV0aG5pY2l0eSwgZWR1Y2F0aW9uLCBqb2IsIGluY29tZSwKICAgICAgICAgcG9saXRpY2FsX3BhcnR5LCBwb2xpdGljYWxfYmVsaWVmcywgZWxpZ2libGVfcHJldGVzdCwgCiAgICAgICAgIGlzX3BhcmVudF9wb3N0dGVzdCwgY2hpbGRyZW5fbnVtX3Bvc3R0ZXN0LCBjaGlsZHJlbl9vbGRlc3RfcG9zdHRlc3QsIAogICAgICAgICBjaGlsZHJlbl95b3VuZ2VzdF9wb3N0dGVzdCwgcGxhbl9wYXJlbnRfcG9zdHRlc3QsCiAgICAgICAgIHN0YXJ0c193aXRoKCJmbHVzaG90XyIpLCBzdGFydHNfd2l0aCgidmF4XyIpLCBzdGFydHNfd2l0aCgiYXR0ZW50aW9uXyIpLAogICAgICAgICBzdGFydHNfd2l0aCgiY29tbWVudHMiKSwgc3RhcnRzX3dpdGgoImR1cmF0aW9uIikpCmRfcHJlIDwtIGRfYWxsICU+JSAKICBzZWxlY3Qod29ya2VySWQsIGVuZHNfd2l0aCgiX3ByZXRlc3QiKSkgJT4lCiAgc2VsZWN0KC1jKGVsaWdpYmxlX3ByZXRlc3QsIHN0YXJ0c193aXRoKCJmbHVzaG90XyIpLCBzdGFydHNfd2l0aCgidmF4XyIpLCAKICAgICAgICAgICAgc3RhcnRzX3dpdGgoImF0dGVudGlvbl8iKSwgc3RhcnRzX3dpdGgoImNvbW1lbnRzIiksIAogICAgICAgICAgICBzdGFydHNfd2l0aCgiZHVyYXRpb24iKSkpICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJfcHJldGVzdCIsICIiLCAuKSkpICU+JQogIG11dGF0ZShwaGFzZSA9ICJwcmUiKQpkX3Bvc3QgPC0gZF9hbGwgJT4lIAogIHNlbGVjdCh3b3JrZXJJZCwgZW5kc193aXRoKCJfcG9zdHRlc3QiKSkgJT4lCiAgc2VsZWN0KC1jKGlzX3BhcmVudF9wb3N0dGVzdCwgY2hpbGRyZW5fbnVtX3Bvc3R0ZXN0LCBjaGlsZHJlbl9vbGRlc3RfcG9zdHRlc3QsCiAgICAgICAgICAgIGNoaWxkcmVuX3lvdW5nZXN0X3Bvc3R0ZXN0LCBwbGFuX3BhcmVudF9wb3N0dGVzdCwKICAgICAgICAgICAgc3RhcnRzX3dpdGgoImZsdXNob3RfIiksIHN0YXJ0c193aXRoKCJ2YXhfIiksIHN0YXJ0c193aXRoKCJhdHRlbnRpb25fIiksCiAgICAgICAgICAgIHN0YXJ0c193aXRoKCJjb21tZW50cyIpLCBzdGFydHNfd2l0aCgiZHVyYXRpb24iKSkpICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJfcG9zdHRlc3QiLCAiIiwgLikpKSAlPiUKICBtdXRhdGUocGhhc2UgPSAicG9zdCIpCgpkIDwtIGJpbmRfcm93cyhkX3ByZSwgZF9wb3N0KSAlPiUgCiAgZ2F0aGVyKHF1ZXN0aW9uLCByZXNwb25zZSwgLWMod29ya2VySWQsIHBoYXNlKSkgJT4lCiAgbXV0YXRlKHBoYXNlID0gZmFjdG9yKHBoYXNlLAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJwcmUiLCAicG9zdCIpKSwKICAgICAgICAgcmV2ZXJzZV9jYXQgPSBpZmVsc2UoZ3JlcGwoIl9bMS05XXIkIiwgcXVlc3Rpb24pLCBUUlVFLCBGQUxTRSksCiAgICAgICAgICMgTk9URTogInJlc3BvbnNlIiBoYXMgYWxyZWFkeSBiZWVuIHJldmVyc2UgY29kZWQhCiAgICAgICAgIHF1ZXN0aW9uID0gZmFjdG9yKHF1ZXN0aW9uKSwKICAgICAgICAgc2NhbGUgPSBmYWN0b3IoZ3N1YigiXy4qJCIsICIiLCBxdWVzdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInZhY2NJbnRlbnQiLCAidmFjY0RhbmdlciIsICJ2YWNjRWZmIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhY2NTdHJhaW4iLCAidmFjY1RveCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXNlYXNlU2V2ZXJlIiwgImRpc2Vhc2VSYXJlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZmFudEltbUxpbUNhcCIsICJpbmZhbnRJbW1XZWFrIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lZFNrZXB0IiwgImhiIiwgIm5hdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdmVycGFyIiwgInBhcmVudEV4cGVydCIpKSkgJT4lCiAgZnVsbF9qb2luKGRfZGVtbykgJT4lCiAgbXV0YXRlKGNvbmRpdGlvbiA9IGZhY3Rvcihjb25kaXRpb24sIGxldmVscyA9IGMoIm5vSW50ZXJ2IiwgImRpc2Vhc2VSaXNrIikpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHJlc3BvbnNlKSwgIWlzLm5hKHdvcmtlcklkKSwgIWlzLm5hKGNvbmRpdGlvbikpICU+JQogIGRpc3RpbmN0KCkKCiMgaG93IG1hbnkgbGVmdD8KZCAlPiUgZGlzdGluY3Qod29ya2VySWQsIGNvbmRpdGlvbikgJT4lIGNvdW50KGNvbmRpdGlvbikKYGBgCgpgYGB7ciBzY29yZXMsIGluY2x1ZGUgPSBGfQojIHNjb3JlIGFsbCBzY2FsZXMKZF9zY29yZWQgPC0gZCAlPiUKICBzZWxlY3Qod29ya2VySWQsIGNvbmRpdGlvbiwgcGhhc2UsIHNjYWxlLCByZXNwb25zZSwKICAgICAgICAgZ2VuZGVyOmR1cmF0aW9uX3Bvc3R0ZXN0KSAlPiUKICBncm91cF9ieSh3b3JrZXJJZCwgY29uZGl0aW9uLCBwaGFzZSwgc2NhbGUpICU+JQogIG11dGF0ZShyZXNwb25zZSA9IGFzLm51bWVyaWMocmVzcG9uc2UpKSAlPiUKICBzdW1tYXJpc2UobWVhbiA9IG1lYW4ocmVzcG9uc2UsIG5hLnJtID0gVFJVRSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBkaXN0aW5jdCgpCmBgYAoKIyBTY29yZSBkaXN0cmlidXRpb25zCgpGaXJzdCwgbGV0J3MgbG9vayBhdCB0aGUgZGlzdHJpYnV0aW9ucyBvZiBzY29yZXMgZm9yIGFsbCBzY2FsZXMsIHByZS0gYW5kIHBvc3QtdGVzdDoKCmBgYHtyIHNjb3JlcyBoaXN0bywgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDJ9CmdncGxvdChkX3Njb3JlZCwgCiAgICAgICBhZXMoeCA9IG1lYW4sIGZpbGwgPSBwaGFzZSkpICsKICAjIGZhY2V0X3dyYXAofiBzY2FsZSwgbmNvbCA9IDUpICsKICBmYWNldF9ncmlkKGNvbmRpdGlvbiB+IHNjYWxlKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDE0LCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsIGFscGhhID0gMC42KSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMywgMywgMSkpICsgCiAgdGhlbWVfYncoKSArCiAgbGFicyh0aXRsZSA9ICJkaXN0cmlidXRpb25zIG9mIHNjb3JlcyBieSBzY2FsZSwgY29uZGl0aW9uLCBhbmQgcGhhc2UgKHByZS9wb3N0KSIpCmBgYAoKYGBge3Igc2NvcmVzIGRlbnNpdHkgcGxvdCwgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDIsIGluY2x1ZGUgPSBGfQojIGdncGxvdChkX3Njb3JlZCwgCiMgICAgICAgIGFlcyh4ID0gbWVhbiwgZmlsbCA9IHBoYXNlLCBjb2xvciA9IHBoYXNlKSkgKwojICAgIyBmYWNldF93cmFwKH4gc2NhbGUsIG5jb2wgPSA1KSArCiMgICBmYWNldF9ncmlkKGNvbmRpdGlvbiB+IHNjYWxlKSArCiMgICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUpICsKIyAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoLTMsIDMsIDEpKSArIAojICAgdGhlbWVfYncoKSArCiMgICBsYWJzKHRpdGxlID0gImRpc3RyaWJ1dGlvbnMgb2Ygc2NvcmVzIGJ5IHNjYWxlLCBjb25kaXRpb24sIGFuZCBwaGFzZSAocHJlL3Bvc3QpIikKYGBgCgpJdCBsb29rcyBsaWtlIHRoZXJlJ3MgYSBsb3Qgb2Ygb3ZlcmxhcCBpbiB0aGUgcHJlLSBhbmQgcG9zdC10ZXN0IGRpc3RydWJ0aW9ucyBmb3IgYWxsIHNjYWxlcyAtIHRob3VnaCBhIGZldyBoaW50cyBvZiBzdWJ0bGUgc2hpZnRzIChlLmcuLCBpbiBgZGlzZWFzZVJhcmVgLCBgdmFjY0ludGVudGApLgoKIyBWaXN1YWwgY29tcGFyaXNvbiBvZiBwcmUtIHZzLiBwb3N0LWludGVydmVudGlvbgoKTGV0J3MgY29tcGFyZSBwYXJ0aWNpcGFudHMnIHJlc3BvbnNlcyBwcmUtIHZzLiBwb3N0LWludGVydmVudGlvbiBvbiBhbGwgc2NhbGVzLiBJJ2xsIHBsb3QgYm90aCBtZWFuIHByZS0gYW5kIHBvc3QtaW50ZXJ2ZW50aW9uIHNjb3JlcywgYXMgd2VsbCBhcyBtZWFuIGRpZmZlcmVuY2Ugc2NvcmVzIChub3RlIHNlcGFyYXRlIGF4ZXMpOgoKYGBge3IgcGxvdCBtZWFucywgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDN9CmRfbWVhbnMgPC0gZF9zY29yZWQgJT4lCiAgZGlzdGluY3Qod29ya2VySWQsIGNvbmRpdGlvbiwgcGhhc2UsIHNjYWxlLCBtZWFuKSAlPiUKICBncm91cF9ieShjb25kaXRpb24sIHBoYXNlLCBzY2FsZSkgJT4lCiAgIyBzdW1tYXJpc2UoTWVhbiA9IG1lYW4obWVhbiwgbmEucm0gPSBUKSwKICAjICAgICAgICAgICBMb3dlciA9IE1lYW4gLSAyICogc2QobWVhbiwgbmEucm0gPSBUKS9zcXJ0KG4oKSksCiAgIyAgICAgICAgICAgVXBwZXIgPSBNZWFuICsgMiAqIHNkKG1lYW4sIG5hLnJtID0gVCkvc3FydChuKCkpKSAlPiUKICBkbyhkYXRhLmZyYW1lKHJiaW5kKHNtZWFuLmNsLmJvb3QoLiRtZWFuKSkpKSAlPiUgIyBib290c3RyYXBwZWQgOTUlIENJCiAgdW5ncm91cCgpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgbXV0YXRlKHNjYWxlID0gZmFjdG9yKHNjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ2YWNjSW50ZW50IiwgInZhY2NEYW5nZXIiLCAidmFjY0VmZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWNjU3RyYWluIiwgInZhY2NUb3giLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlzZWFzZVNldmVyZSIsICJkaXNlYXNlUmFyZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmZhbnRJbW1MaW1DYXAiLCAiaW5mYW50SW1tV2VhayIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZWRTa2VwdCIsICJoYiIsICJuYXQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3ZlcnBhciIsICJwYXJlbnRFeHBlcnQiKSksCiAgICAgICAgIGNvbmRpdGlvbiA9IGZhY3Rvcihjb25kaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJkaXNlYXNlUmlzayIsICJhdXRpc21Db3JyIiwgIm5vSW50ZXJ2IikpKQoKZ19tZWFucyA8LSBnZ3Bsb3QoZF9tZWFucywKICAgICAgICAgICAgICAgICAgYWVzKHggPSBwaGFzZSwgeSA9IE1lYW4sCiAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGNvbmRpdGlvbiwgZ3JvdXAgPSBjb25kaXRpb24pKSArCiAgZmFjZXRfd3JhcCh+IHNjYWxlLCBuY29sID0gMykgKwogIGdlb21fcGF0aChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4xKSkgKwogIGdlb21fbGluZXJhbmdlKGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlciksCiAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoIm1lYW4gc2NvcmUiLCAKICAgICAgICAgICAgICAgICAgICAgIyBsaW1pdHMgPSBjKC0zLCAzKSwKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKC0zLCAzLCAxKSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiLCBkaXJlY3Rpb24gPSAtMSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgbGFicyh0aXRsZSA9ICJtZWFuIHNjb3JlcyBieSBwaGFzZSBhbmQgY29uZGl0aW9uIiwKICAgICAgIHN1YnRpdGxlID0gImVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgQ0lzIikKCmdfbWVhbnMKYGBgCgpgYGB7ciBwbG90IGRpZmZzLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gM30KZF9kaWZmcyA8LSBkX3Njb3JlZCAlPiUKICBzcHJlYWQocGhhc2UsIG1lYW4pICU+JQogIG11dGF0ZShwb3N0X3ByZV9kaWZmID0gcG9zdCAtIHByZSkgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uLCBzY2FsZSkgJT4lCiAgZG8oZGF0YS5mcmFtZShyYmluZChzbWVhbi5jbC5ib290KC4kcG9zdF9wcmVfZGlmZikpKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZShzY2FsZSA9IGZhY3RvcihzY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidmFjY0ludGVudCIsICJ2YWNjRGFuZ2VyIiwgInZhY2NFZmYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFjY1N0cmFpbiIsICJ2YWNjVG94IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpc2Vhc2VTZXZlcmUiLCAiZGlzZWFzZVJhcmUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5mYW50SW1tTGltQ2FwIiwgImluZmFudEltbVdlYWsiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVkU2tlcHQiLCAiaGIiLCAibmF0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm92ZXJwYXIiLCAicGFyZW50RXhwZXJ0IikpLAogICAgICAgICBjb25kaXRpb24gPSBmYWN0b3IoY29uZGl0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiZGlzZWFzZVJpc2siLCAiYXV0aXNtQ29yciIsICJub0ludGVydiIpKSkKCmdfZGlmZnMgPC0gZ2dwbG90KGRfZGlmZnMsCiAgICAgICAgICAgICAgICAgIGFlcyh4ID0gY29uZGl0aW9uLCB5ID0gTWVhbiwgCiAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGNvbmRpdGlvbiwgZ3JvdXAgPSBjb25kaXRpb24pKSArCiAgZmFjZXRfd3JhcCh+IHNjYWxlLCBuY29sID0gMykgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIsIHNpemUgPSAwLjUpICsKICBnZW9tX2xpbmVyYW5nZShhZXMoeW1pbiA9IExvd2VyLCB5bWF4ID0gVXBwZXIpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIHNjYWxlX3lfY29udGludW91cygibWVhbiBkaWZmIikgKyAjLCAKICAgICAgICAgICAgICAgICAgICAgIyBsaW1pdHMgPSBjKC0zLCAzKSwgCiAgICAgICAgICAgICAgICAgICAgICMgYnJlYWtzID0gc2VxKC0zLCAzLCAxKSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiLCBkaXJlY3Rpb24gPSAtMSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJtZWFuIGRpZmZlcmVuY2Ugc2NvcmVzIGJ5IHNjYWxlIGFuZCBjb25kaXRpb24iLAogICAgICAgc3VidGl0bGUgPSAiZXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBDSXMiKQoKZ19kaWZmcwpgYGAKCmBgYHtyIHBsb3QgbWVhbnMgYW5kIGRpZmZzLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gM30KbXVsdGlwbGljYW5kIDwtIDYKbXVsdGlfZnVuIDwtIGZ1bmN0aW9uKHgsIG11bHRpID0gbXVsdGlwbGljYW5kKXtyZXR1cm4oeCAqIG11bHRpKX0KZ19tZWFucyArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gMi41LCB4ZW5kID0gMy41LCB5ID0gMCwgeWVuZCA9IDApLCAKICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBsdHkgPSAiZGFzaGVkIiwgc2l6ZSA9IDAuMykgKwogIGdlb21fbGluZXJhbmdlKGRhdGEgPSBkX2RpZmZzICU+JSAKICAgICAgICAgICAgICAgICAgIG11dGF0ZV9hdCh2YXJzKE1lYW4sIExvd2VyLCBVcHBlciksIGZ1bnMobXVsdGlfZnVuKSkgJT4lCiAgICAgICAgICAgICAgICAgICBtdXRhdGUocGhhc2UgPSAiZGlmZiIpLAogICAgICAgICAgICAgICAgIGFlcyh4ID0gcGhhc2UsIHltaW4gPSBMb3dlciwgeW1heCA9IFVwcGVyKSwKICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IGRfZGlmZnMgJT4lCiAgICAgICAgICAgICAgIG11dGF0ZV9hdCh2YXJzKE1lYW4sIExvd2VyLCBVcHBlciksIGZ1bnMobXVsdGlfZnVuKSkgJT4lCiAgICAgICAgICAgICAgIG11dGF0ZShwaGFzZSA9ICJkaWZmIiksCiAgICAgICAgICAgICBhZXMoeCA9IHBoYXNlLCB5ID0gTWVhbiksCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwKICAgICAgICAgICAgIHNpemUgPSAyLCBzaGFwZSA9IDE3KSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJwcmUiLCAicG9zdCIsICJkaWZmIikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoIm1lYW4gc2NvcmUiLCBicmVha3MgPSBzZXEoLTMsIDMsIDEpLAogICAgICAgICAgICAgICAgICAgICBzZWMuYXhpcyA9IHNlY19heGlzKH4uL211bHRpcGxpY2FuZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJtZWFuIGRpZmYiKSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiLCBkaXJlY3Rpb24gPSAtMSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCAKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBsYWJzKHRpdGxlID0gIm1lYW5zIGFuZCBtZWFuIGRpZmZlcmVuY2Ugc2NvcmVzIGJ5IHNjYWxlIGFuZCBjb25kaXRpb24iLAogICAgICAgc3VidGl0bGUgPSAiZXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBDSXNcbk5PVEU6dXNlIGxlZnQgeS1heGlzIGZvciBwcmUgYW5kIHBvc3QgcGhhc2VzLCByaWdodCB5LWF4aXMgZm9yIGRpZmZlcmVuY2Ugc2NvcmVzIikKYGBgCgpTb21lIGludGVyZXN0aW5nIHRoaW5ncyBtaWdodCBiZSBnb2luZyBvbiBoZXJlISBQcm9iYWJseSBtb3N0IHVzZWZ1bCBwYWlyZWQgd2l0aCBzb21lIGFjdHVhbCBzdGF0cy4uLgoKIyBSZWdyZXNzaW9uIGFuYWx5c2VzCgpGaXJzdCwgbGV0J3MgY2hvb3NlIGhvdyB0byBjb2RlIG91ciBkYXRhIC0gSSd2ZSBzZXQgdXAgY29udHJhc3QgY29kaW5nLCBlZmZlY3QgY29kaW5nIGFuZCBkdW1teSBjb2Rpbmcgb3B0aW9ucyBoZXJlLCBhbmQgSSdsbCBnbyB3aXRoIGR1bW15LWNvZGluZyBmb3Igbm93ICh3aXRoIGBub0ludGVydmAgYW5kIGBwcmVgIGFzIHRoZSBiYXNlbGluZXMgZm9yIGNvbXBhcmlzb24gZm9yIGNvbmRpdGlvbiBhbmQgcGhhc2UsIHJlc3BlY3RpdmVseSkuCgpgYGB7ciBjb250cmFzdHMsIGluY2x1ZGUgPSBGfQojICMgb3J0aG9nb25hbCBjb250cmFzdCBjb2RpbmcKIyBjb250cmFzdHMoZF9zY29yZWQkY29uZGl0aW9uKSA8LSBjYmluZChpbnRlcnZfbm9uZSA9IGMoMSwgMSwgLTIpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSX0FDID0gYygxLCAtMSwgMCkpCiMgY29udHJhc3RzKGRfc2NvcmVkJHBoYXNlKSA8LSBjYmluZChwb3N0X0dNID0gYygtMSwgMSkpCgojICMgZWZmZWN0IGNvZGluZwojIGNvbnRyYXN0cyhkX3Njb3JlZCRjb25kaXRpb24pIDwtIGNiaW5kKERSX0dNID0gYygxLCAwLCAtMSksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNfR00gPSBjKDAsIDEsIC0xKSkKIyBjb250cmFzdHMoZF9zY29yZWQkcGhhc2UpIDwtIGNiaW5kKHBvc3RfR00gPSBjKC0xLCAxKSkKCiMgZHVtbXkgY29kaW5nCmNvbnRyYXN0cyhkX3Njb3JlZCRjb25kaXRpb24pIDwtIGNiaW5kKERSX25vbmUgPSBjKDAsIDEpKQpjb250cmFzdHMoZF9zY29yZWQkcGhhc2UpIDwtIGNiaW5kKHBvc3RfcHJlID0gYygwLCAxKSkKYGBgCgpgYGB7ciBwcmludCBjb250cmFzdHN9CiMgcHJpbnQgb3V0IGNvbnRyYXN0cwpjb250cmFzdHMoZF9zY29yZWQkY29uZGl0aW9uKQpjb250cmFzdHMoZF9zY29yZWQkcGhhc2UpCmBgYAoKIyMgQnkgc2NhbGUKClRoaXMgaXMgcmF0aGVyIGNyYXp5IChhbmQgb2YgY291cnNlIGV4cGxvcmF0b3J5KSBlbmRlYXZvciwgYW5kIHZlcnkgdnVsbmVyYWJsZSB0byBtdWx0aXBsZSBjb21wYXJpc29ucy4uLiBidXQgbGV0J3MgbG9vayBhdCB0aGUgZWZmZWN0cyBvbiBhbGwgc2NhbGVzIGluZGl2aWR1YWxseS4KCiMjIyBCZWxpZWZzIGFib3V0IHZhY2NpbmVzCgojIyMjIEludGVudGlvbnMgdG8gdmFjY2luYXRlIChgdmFjY0ludGVudGApCgo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+KipOT1RFKio6IFRoaXMgaXMgb3VyIG1haW4gRFYgb2YgaW50ZXJlc3QuPC9zcGFuPgoKYGBge3IgcmVncmVzc2lvbiB2YWNjSW50ZW50fQojIHZhY2NJbnRlbnQKcjFfdmFjY0ludGVudCA8LSBsbWVyKG1lYW4gfiBwaGFzZSAqIGNvbmRpdGlvbiArICgxIHwgd29ya2VySWQpLAogICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRfc2NvcmVkICU+JSBmaWx0ZXIoc2NhbGUgPT0gInZhY2NJbnRlbnQiKSkKc3VtbWFyeShyMV92YWNjSW50ZW50KQpgYGAKClN1Y2Nlc3MhIEluIHRoZSBmb3JtIG9mIGEgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb24gYmV0d2VlbiBwaGFzZSBhbmQgY29uZGl0aW9uICAoYHBoYXNlcG9zdF9wcmU6Y29uZGl0aW9uRFJfbm9uZWA6IGNoYW5nZSBmcm9tIHByZS0gdG8gcG9zdC1pbnRlcnZlbnRpb24gaW4gdGhlIERpc2Vhc2UgUmlzayB2cy4gTm8gSW50ZXJ2ZW50aW9uIGNvbmRpdGlvbnMpLgoKQW4gYW5hbHlzaXMgd2l0aCBjaGFuZ2Ugc2NvcmVzIChhIGxhIEhvcm5lLCBQb3dlbGwsIGV0IGFsLiAoMjAxNSwgKlBOQVMqKSk6CgpgYGB7ciByZWdyZXNzaW9uIGNoYW5nZSBzY29yZXMgdmFjY0ludGVudH0KIyB2YWNjSW50ZW50CnIyX3ZhY2NJbnRlbnQgPC0gbG0oZGlmZiB+IGNvbmRpdGlvbiwKICAgICAgICAgICAgICAgICAgICBkYXRhID0gZF9zY29yZWQgJT4lIAogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHNjYWxlID09ICJ2YWNjSW50ZW50IikgJT4lCiAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQocGhhc2UsIG1lYW4pICU+JQogICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKGRpZmYgPSBwb3N0IC0gcHJlKSkKc3VtbWFyeShyMl92YWNjSW50ZW50KQoKIyAjIGluIGNhc2UgeW91IHdhbnQgdG8gY2hlY2sgZXF1aXZhbGVuY2UgdG8gQU5PVkEKIyByM192YWNjSW50ZW50IDwtIG9uZXdheS50ZXN0KGRpZmYgfiBjb25kaXRpb24sCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZF9zY29yZWQgJT4lCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihzY2FsZSA9PSAidmFjY0ludGVudCIpICU+JQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQocGhhc2UsIG1lYW4pICU+JQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoZGlmZiA9IHBvc3QgLSBwcmUpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLmVxdWFsID0gVFJVRSkKIyByM192YWNjSW50ZW50CmBgYAoKQWdhaW4sIHN1Y2Nlc3MhCgpIZXJlJ3MgdGhlIHJlbGV2YW50IHBsb3QgZnJvbSB0aGUgKlBOQVMqIHBhcGVyOgoKYGBge3IgcGxvdCBjaGFuZ2Ugc2NvcmVzIHZhY2NJbnRlbnQsIGZpZy53aWR0aCA9IDIsIGZpZy5oZWlnaHQgPSAyfQpnZ3Bsb3QoZF9kaWZmcyAlPiUgZmlsdGVyKHNjYWxlID09ICJ2YWNjSW50ZW50IiksCiAgICAgICBhZXMoeCA9IGNvbmRpdGlvbiwgeSA9IE1lYW4sIGZpbGwgPSBjb25kaXRpb24pKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMikgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IExvd2VyLCB5bWF4ID0gVXBwZXIpLCB3aWR0aCA9IDAuMSkgKwogIHNjYWxlX3lfY29udGludW91cygidmFjY0ludGVudCBjaGFuZ2Ugc2NvcmUiLCBsaW1pdHMgPSBjKC0uMjUsIC41KSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIsIGRpcmVjdGlvbiA9IC0xKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJlcnJvciBiYXJzIGFyZSA5NSUgYm9vdHN0cmFwcGVkIENJcyIpCmBgYAoKIyMjIyBWYWNjaW5lIGRhbmdlciAoYHZhY2NEYW5nZXJgKQoKYGBge3IgcmVncmVzc2lvbiB2YWNjRGFuZ2VyfQojIHZhY2NEYW5nZXIKcjFfdmFjY0RhbmdlciA8LSBsbWVyKG1lYW4gfiBwaGFzZSAqIGNvbmRpdGlvbiArICgxIHwgd29ya2VySWQpLAogICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRfc2NvcmVkICU+JSBmaWx0ZXIoc2NhbGUgPT0gInZhY2NEYW5nZXIiKSkKc3VtbWFyeShyMV92YWNjRGFuZ2VyKQpgYGAKCiMjIyMgVmFjY2luZSBlZmZpY2FjeSAoYHZhY2NFZmZgKQoKYGBge3IgcmVncmVzc2lvbiB2YWNjRWZmfQojIHZhY2NFZmYKcjFfdmFjY0VmZiA8LSBsbWVyKG1lYW4gfiBwaGFzZSAqIGNvbmRpdGlvbiArICgxIHwgd29ya2VySWQpLAogICAgICAgICAgICAgICAgICAgZGF0YSA9IGRfc2NvcmVkICU+JSBmaWx0ZXIoc2NhbGUgPT0gInZhY2NFZmYiKSkKc3VtbWFyeShyMV92YWNjRWZmKQpgYGAKCiMjIyMgVmFjY2luZXMnIHRlbmRlbmN5IHRvIHN0cmFpbiB0aGUgaW5mYW50IGltbXVuZSBzeXN0ZW0gKGB2YWNjU3RyYWluYCkKCmBgYHtyIHJlZ3Jlc3Npb24gdmFjY1N0cmFpbn0KIyB2YWNjU3RyYWluCnIxX3ZhY2NTdHJhaW4gPC0gbG1lcihtZWFuIH4gcGhhc2UgKiBjb25kaXRpb24gKyAoMSB8IHdvcmtlcklkKSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkX3Njb3JlZCAlPiUgZmlsdGVyKHNjYWxlID09ICJ2YWNjU3RyYWluIikpCnN1bW1hcnkocjFfdmFjY1N0cmFpbikKYGBgCgojIyMjIFZhY2NpbmUgdG94aWNpdHkgKGB2YWNjVG94YCkKCmBgYHtyIHJlZ3Jlc3Npb24gdmFjY1RveH0KIyB2YWNjVG94CnIxX3ZhY2NUb3ggPC0gbG1lcihtZWFuIH4gcGhhc2UgKiBjb25kaXRpb24gKyAoMSB8IHdvcmtlcklkKSwKICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkX3Njb3JlZCAlPiUgZmlsdGVyKHNjYWxlID09ICJ2YWNjVG94IikpCnN1bW1hcnkocjFfdmFjY1RveCkKYGBgCgojIyMgQmVsaWVmcyBhYm91dCBkaXNlYXNlcwoKIyMjIyBEaXNlYXNlIHNldmVyaXR5IChgZGlzZWFzZVNldmVyZWApCgo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+KipOT1RFKio6IFRoaXMgaXMgdGhlIHNjYWxlIHRoYXQgd2UgdGhvdWdodCB0aGUgRGlzZWFzZSBSaXNrIGludGVydmVudGlvbiBzaG91bGQgYWZmZWN0IG1vc3QgZGlyZWN0bHkuPC9zcGFuPgoKYGBge3IgcmVncmVzc2lvbiBkaXNlYXNlU2V2ZXJlfQojIGRpc2Vhc2VTZXZlcmUKcjFfZGlzZWFzZVNldmVyZSA8LSBsbWVyKG1lYW4gfiBwaGFzZSAqIGNvbmRpdGlvbiArICgxIHwgd29ya2VySWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRfc2NvcmVkICU+JSBmaWx0ZXIoc2NhbGUgPT0gImRpc2Vhc2VTZXZlcmUiKSkKc3VtbWFyeShyMV9kaXNlYXNlU2V2ZXJlKQpgYGAKCiMjIyMgRGlzZWFzZSByYXJpdHkgKGBkaXNlYXNlUmFyZWApCgpgYGB7ciByZWdyZXNzaW9uIGRpc2Vhc2VSYXJlfQojIGRpc2Vhc2VSYXJlCnIxX2Rpc2Vhc2VSYXJlIDwtIGxtZXIobWVhbiB+IHBoYXNlICogY29uZGl0aW9uICsgKDEgfCB3b3JrZXJJZCksCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRfc2NvcmVkICU+JSBmaWx0ZXIoc2NhbGUgPT0gImRpc2Vhc2VSYXJlIikpCnN1bW1hcnkocjFfZGlzZWFzZVJhcmUpCmBgYAoKIyMjIEJlbGllZnMgYWJvdXQgaW5mYW50cycgaW1tdW5lIHN5c3RlbXMKCiMjIyMgTGltaXRlZCBjYXBhY2l0eSBvZiBpbmZhbnRzJyBpbW11bmUgc3lzdGVtcyAoYGluZmFudEltbUxpbUNhcGApCgpgYGB7ciByZWdyZXNzaW9uIGluZmFudEltbUxpbUNhcH0KIyBpbmZhbnRJbW1MaW1DYXAKcjFfaW5mYW50SW1tTGltQ2FwIDwtIGxtZXIobWVhbiB+IHBoYXNlICogY29uZGl0aW9uICsgKDEgfCB3b3JrZXJJZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkX3Njb3JlZCAlPiUgZmlsdGVyKHNjYWxlID09ICJpbmZhbnRJbW1MaW1DYXAiKSkKc3VtbWFyeShyMV9pbmZhbnRJbW1MaW1DYXApCmBgYAoKIyMjIyBXZWFrbmVzcyBvZiBpbmZhbnRzJyBpbW11bmUgc3lzdGVtcyAoYGluZmFudEltbVdlYWtgKQoKYGBge3IgcmVncmVzc2lvbiBpbmZhbnRJbW1XZWFrfQojIGluZmFudEltbVdlYWsKcjFfaW5mYW50SW1tV2VhayA8LSBsbWVyKG1lYW4gfiBwaGFzZSAqIGNvbmRpdGlvbiArICgxIHwgd29ya2VySWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRfc2NvcmVkICU+JSBmaWx0ZXIoc2NhbGUgPT0gImluZmFudEltbVdlYWsiKSkKc3VtbWFyeShyMV9pbmZhbnRJbW1XZWFrKQpgYGAKCiMjIyBPdGhlciBiZWxpZWZzLCBhdHRpdHVkZXMsIGFuZCB3b3JsZHZpZXdzCgojIyMjIE1lZGljYWwgc2tlcHRpY2lzbSAoYG1lZFNrZXB0YCkKCmBgYHtyIHJlZ3Jlc3Npb24gbWVkU2tlcHR9CiMgbWVkU2tlcHQKcjFfbWVkU2tlcHQgPC0gbG1lcihtZWFuIH4gcGhhc2UgKiBjb25kaXRpb24gKyAoMSB8IHdvcmtlcklkKSwKICAgICAgICAgICAgICAgICAgICBkYXRhID0gZF9zY29yZWQgJT4lIGZpbHRlcihzY2FsZSA9PSAibWVkU2tlcHQiKSkKc3VtbWFyeShyMV9tZWRTa2VwdCkKYGBgCgojIyMjIEhvbGlzdGljIGJhbGFuY2UgKGBoYmApCgpgYGB7ciByZWdyZXNzaW9uIGhifQojIGhiCnIxX2hiIDwtIGxtZXIobWVhbiB+IHBoYXNlICogY29uZGl0aW9uICsgKDEgfCB3b3JrZXJJZCksCiAgICAgICAgICAgICAgZGF0YSA9IGRfc2NvcmVkICU+JSBmaWx0ZXIoc2NhbGUgPT0gImhiIikpCnN1bW1hcnkocjFfaGIpCmBgYAoKIyMjIyBOYXR1cmFsaXNtIChgbmF0YCkKCmBgYHtyIHJlZ3Jlc3Npb24gbmF0fQojIG5hdApyMV9uYXQgPC0gbG1lcihtZWFuIH4gcGhhc2UgKiBjb25kaXRpb24gKyAoMSB8IHdvcmtlcklkKSwKICAgICAgICAgICAgICAgZGF0YSA9IGRfc2NvcmVkICU+JSBmaWx0ZXIoc2NhbGUgPT0gIm5hdCIpKQpzdW1tYXJ5KHIxX25hdCkKYGBgCgojIyMjIE92ZXJwYXJlbnRpbmcgKGBvdmVycGFyYCkKCmBgYHtyIHJlZ3Jlc3Npb24gb3ZlcnBhcn0KIyBvdmVycGFyCnIxX292ZXJwYXIgPC0gbG1lcihtZWFuIH4gcGhhc2UgKiBjb25kaXRpb24gKyAoMSB8IHdvcmtlcklkKSwKICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkX3Njb3JlZCAlPiUgZmlsdGVyKHNjYWxlID09ICJvdmVycGFyIikpCnN1bW1hcnkocjFfb3ZlcnBhcikKYGBgCgojIyMjIFBhcmVudGFsIEV4cGVydGlzZSAoYHBhcmVudEV4cGVydGApCgpgYGB7ciByZWdyZXNzaW9uIHBhcmVudEV4cGVydH0KIyBwYXJlbnRFeHBlcnQKcjFfcGFyZW50RXhwZXJ0IDwtIGxtZXIobWVhbiB+IHBoYXNlICogY29uZGl0aW9uICsgKDEgfCB3b3JrZXJJZCksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkX3Njb3JlZCAlPiUgZmlsdGVyKHNjYWxlID09ICJwYXJlbnRFeHBlcnQiKSkKc3VtbWFyeShyMV9wYXJlbnRFeHBlcnQpCmBgYAoKIyBPdGhlciBzdHVmZgoKIyMgVmlvbGluIHBsb3RzCgpXaXRoIHZpb2xpbiBwbG90cywgd2UgY2FuIHNlZSB0aGUgZnVsbCBkaXN0cmlidXRpb24gb2Ygc2NvcmVzIGF0IGVhY2ggdGltZSBwb2ludCBpbiBlYWNoIGNvbmRpdGlvbjoKCmBgYHtyIHBsb3QgdmlvbGluLCBmaWcud2lkdGggPSAzLCBmaWcuaGVpZ2h0ID0gNX0KZ2dwbG90KGRfc2NvcmVkLAogICAgICAgYWVzKHggPSBpbnRlcmFjdGlvbihwaGFzZSwgY29uZGl0aW9uKSwgeSA9IG1lYW4sICMgZmlsbCA9IGNvbmRpdGlvbiwgCiAgICAgICAgICAgZ3JvdXAgPSBpbnRlcmFjdGlvbihwaGFzZSwgY29uZGl0aW9uKSkpICsKICBmYWNldF93cmFwKH4gc2NhbGUsIG5jb2wgPSAzKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb25kaXRpb24pLAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjMsIGhlaWdodCA9IDApLCAKICAgICAgICAgICAgIGFscGhhID0gMC41KSArCiAgIyBnZW9tX2JveHBsb3QoYWxwaGEgPSAwKSArCiAgZ2VvbV92aW9saW4oYWxwaGEgPSAwLAogICAgICAgICAgICAgIGRyYXdfcXVhbnRpbGVzID0gYygwLjI1LCAwLjUsIDAuNzUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJtZWFuIHNjb3JlIiwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTMsIDMpLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKC0zLCAzLCAxKSkgKwogIHNjYWxlX3hfZGlzY3JldGUoInBoYXNlIGJ5IGNvbmRpdGlvbiIsCiAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSByZXAoYygicHJlIiwgInBvc3QiKSwgMykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKyAjLAogICAgICAgICMgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkKICBsYWJzKHRpdGxlID0gInZpb2xpbiBwbG90IG9mIHByZS0gYW5kIHBvc3QtaW50ZXJ2ZW50aW9uIHNjb3JlcyBieSBzY2FsZSBhbmQgY29uZGl0aW9uIiwKICAgICAgIHN1YnRpdGxlID0gImhvcml6b250YWwgbGluZXMgY29ycmVzcG9uZCB0byAyNXRoLCA1MHRoLCBhbmQgNzV0aCBwZXJjZW50aWxlcyIpCmBgYAoKIyBEZXJlaydzIGFuYWx5c2VzCgpfREFURV86IE1hcmNoIDEzLCAyMDE4IDM6NTIgUE0KCkknbSBnb2luZyB0byBwaWNrIHVwIGhlcmUgYW5kIGRvIHNvbWUgZnVydGhlciByZWdyZXNzaW9uIGFuYWx5c2VzLiBJJ2xsIGxvb2sgYXQgdGhpcyBkYXRhIGluIHRoZSB3YXkgSSAqd2lzaCogd2UnZCBsb29rZWQgYXQgdGhlIG9yaWdpbmFsIFBOQVMgZGF0YS4KClRoYXQgaXMsICgxKSB1c2luZyBhbiBvcmRpbmFsIEhMTSByZWdyZXNzaW9uIG92ZXIgdGhlIGZpdmUgc2VwYXJhdGUgc2NhbGUgaXRlbXMgKGNvbmNlcHR1YWxseSwgSSB0aGluaywgc2ltaWxhciB0byBTRU0tc3R5bGUgYXBwcm9hY2hlcyksIGFuZCAoMikgdXNpbmcgYmV0YSByZWdyZXNzaW9uLgoKVGhlcmUgYXJlIHR3byBnZW5lcmFsIG1vZGVsIGZvcm1zIHRoYXQgSSB0aGluayBhcmUgcmVhc29uYWJsZSBmb3IgbG9va2luZyBhdCB0aGlzLiBGaXJzdDoKCmBgYApyZXNwb25zZSB+IHBoYXNlICogY29uZGl0aW9uCmBgYAoKS2FyYSBhbHJlYWR5IHRyaWVkIHRoaXMgZ2VuZXJhbCBhcHByb2FjaCwgc2F2aW5nIHRoZSBtb2RlbCBhcyBgcjFfdmFjY0ludGVudGAuIFNvIHRoZSBvbmx5IGRpZmZlcmVuY2UgaGVyZSB3aWxsIGJlIHRoZSBkaXN0cmlidXRpb25zIEkgdXNlLiBJbiB0aGlzIGNhc2UsIHRoZSBpbnRlcmFjdGlvbiB0ZXJtIGlzIHJlcXVpcmVkLCBhbmQgdGhlIHJlYWwgdGhpbmcgdG8gdGVzdCBpcyB0aGUgcGhhc2UqY29uZGl0aW9uIGludGVyYWN0aW9uLiAKCkFuZCBzZWNvbmQ6CgpgYGAKcG9zdF9yZXNwb25zZSB+IHByZV9yZXNwb25zZSAqIGNvbmRpdGlvbgpgYGAKCkhlcmUgcHJlX3Jlc3BvbnNlIGNvdWxkIGJlIHRoZSByZXNwb25zZSBvbiB0aGUgb3ZlcmFsbCBwcmUtdGVzdCBzY2FsZSwgb3IgdGhlIGluZGl2aWR1YWwgaXRlbXMuIEluIGFkZGl0aW9uLCB0aGUgaW50ZXJhY3Rpb24gdGVybXMgYXJlIG9wdGlvbmFsLCBhcyB3YXJyYW50ZWQgYnkgdGhlIGRhdGEuIEknZCB3YWdlciB0aGlzIGlzIHRoZSBtb3JlIGZhbWlsaWFyIGFwcHJvYWNoIGZvciBtb3N0IHBzeWNob2xvZ2lzdHMuCgojIyBPcmRpbmFsIEhMTQoKIyMjIFByZWRpY3RpbmcgInJlc3BvbnNlIgoKYGBge3J9CgojIGxpYnJhcnkoYnJtcykKIyBmaXQub3JkIDwtIGJybShyZXNwb25zZSB+IGNvbmRpdGlvbiAqIHBoYXNlICsgKDF8d29ya2VySWQpICsgKDF8cXVlc3Rpb24pLCAKIyAgICAgICAgICAgICAgICBkYXRhPWQgJT4lCiMgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc2NhbGU9PSJ2YWNjSW50ZW50IikgJT4lCiMgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoY29uZGl0aW9uID0gcmVsZXZlbChjb25kaXRpb24sIHJlZj0ibm9JbnRlcnYiKSksCiMgICAgICAgICAgICAgICAgZmFtaWx5PWN1bXVsYXRpdmUoKSwKIyAgICAgICAgICAgICAgICBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IC44NSksCiMgICAgICAgICAgICAgICAgY29yZXMgPSBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKSwKIyAgICAgICAgICAgICAgICBpdGVyID0gMjAwMCkKIyBzdW1tYXJ5KGZpdC5vcmQpCmBgYAoKIyMjIFByZWRpY3RpbmcgcG9zdC10ZXN0CgpIZXJlIGBwcmVgIGlzIHRoZSBzcGVjaWZpYyBpdGVtIHByZS10ZXN0IHNjb3JlIGFuZCBgcHJlTWVhbmAgaXMgdGhlIG1lYW4gb2YgdGhlIHNjYWxlIGF0IHByZXRlc3QuCgpgYGB7cn0KIyBkMSA8LSBkICU+JQojICAgZmlsdGVyKHNjYWxlPT0idmFjY0ludGVudCIpICU+JQojICAgbXV0YXRlKGNvbmRpdGlvbiA9IHJlbGV2ZWwoY29uZGl0aW9uLCByZWY9Im5vSW50ZXJ2IikpICU+JSAKIyAgIHNwcmVhZChwaGFzZSxyZXNwb25zZSkgJT4lCiMgICBzZWxlY3QocHJlLCBwb3N0LCBjb25kaXRpb24sIHdvcmtlcklkLCBxdWVzdGlvbikgJT4lCiMgICB7CiMgICAgIHsuIC0+IHRtcH0gJT4lIAojICAgICAgIGdyb3VwX2J5KHdvcmtlcklkKSAlPiUKIyAgICAgICBzdW1tYXJpemUocHJlTWVhbj1tZWFuKHByZSkpICU+JQojICAgICAgIGxlZnRfam9pbih0bXAsIGJ5PSJ3b3JrZXJJZCIpCiMgICB9CmBgYAoKCmBgYHtyfQojIGZpdC5vcmQyIDwtIGJybShwb3N0IH4gY29uZGl0aW9uICsgcHJlTWVhbiArICgxfHdvcmtlcklkKSArICgxfHF1ZXN0aW9uKSwgCiMgICAgICAgICAgICAgICAgZGF0YT1kMSwKIyAgICAgICAgICAgICAgICBmYW1pbHk9Y3VtdWxhdGl2ZSgpLAojICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gLjg1KSwKIyAgICAgICAgICAgICAgICBjb3JlcyA9IHBhcmFsbGVsOjpkZXRlY3RDb3JlcygpLAojICAgICAgICAgICAgICAgIGl0ZXIgPSAyMDAwKQojIHN1bW1hcnkoZml0Lm9yZDIpCmBgYAoKCiMjIFJlZ3Jlc3Npb24gb24gc2NhbGUgYXZlcmFnZXMKClJlY2FsbCwgS2FyYSBhbHJlYWR5IGxvb2tlZCBhdCBhIG5vcm1hbCByZWdyZXNzaW9uIG9uIHJlc3BvbnNlcyB3aXRoIGByMV92YWNjSW50ZW50YCBtb2RlbC4KCiMjIyBOb3JtYWwgcmVncmVzc2lvbjogcHJlZGljdGluZyBwb3N0LXRlc3QKCmBgYHtyfQpkMiA8LSBkX3Njb3JlZCAlPiUgZmlsdGVyKHNjYWxlPT0idmFjY0ludGVudCIpICU+JSBzcHJlYWQocGhhc2UsbWVhbikgJT4lIG11dGF0ZShjb25kaXRpb24gPSByZWxldmVsKGNvbmRpdGlvbiwgcmVmPSJub0ludGVydiIpKQoKY29udHJhc3RzKGQyJGNvbmRpdGlvbikgPC0gY2JpbmQoZGlzZWFzZVJpc2sgPSBjKDAsIDEpKQoKZml0LmxtIDwtIGxtKHBvc3QgfiBzY2FsZShwcmUpICogY29uZGl0aW9uLAogICAgICAgICAgICAgICAgICAgIGRhdGE9ZDIpCnN1bW1hcnkoZml0LmxtKQpgYGAKCiMjIyBCZXRhIHJlZ3Jlc3Npb246IHJlc3BvbnNlCgpBIGJldGEgcmVncmVzc2lvbiBvbiB0aGUgcmVzcG9uc2VzIGFjY29yZHMgd2l0aCB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gb24gcmVzcG9uc2VzLS1zbGlnaHQgcG9zaXRpdmUgZWZmZWN0IG9mIGRpc2Vhc2VSaXNrLCBzbGlnaHQgbmVnYXRpdmUgZWZmZWN0IG9mIGF1dGlzbSBjb3JyZWN0aW9uLCBidXQgdG9vIG11Y2ggdW5jZXJ0YWludHkgb3ZlcmFsbC4KCkJ1dCwgb3VyIHJlc3BvbnNlIHZhcmlhYmxlIGlzbid0IHJlYWxseSBhbGwgdGhhdCBhcHByb3ByaWF0ZSBmb3IgYSBsaW5lYXIgcmVncmVzc2lvbiwgZXZlbiBpZiBtYW55IHJlc2VhcmNoZXJzIHdvdWxkIGJlIGhhcHB5IHdpdGggdGhhdCByZXN1bHRzIGFuZCBtb3ZlIG9uLiBJbnN0ZWFkLCB2YWNjSW50ZW50IGlzIGJvdW5kZWQgYW5kIGhpZ2hseSBza2V3ZWQuIFRoYXQgbWFrZXMgaXQgc3VpdGFibGUgZm9yIGJldGEgcmVncmVzc2lvbi4KCmBgYHtyfQpyZXNjYWxlX2JldGEgPC0gZnVuY3Rpb24oeCwgbG93ZXIsIHVwcGVyKSB7CiAgIyByZXNjYWxlcyBvbnRvIHRoZSBvcGVuIGludGVydmFsICgwLDEpCiAgIyByZXNjYWxlcyBvdmVyIHRoZW9yZXRpY2FsIGJvdW5kcyBvZiBtZWFzdXJlbWVudCwgc3BlY2lmaWVkIGJ5ICJ1cHBlciIgYW5kICJsb3dlciIKICAjIGJhc2VkIG9uIFNtaXRoc29uICYgVmVya3VpbGVuICgyMDA2KSwgdGhvdWdoIHRoaXMgaXMgbm90IGFzIHByaW5jaXBsZWQgYXMgeW91IG1pZ2h0IHRoaW5rCiAgIyBzZWUgaHR0cDovL2R4LmRvaS5vcmcvMTAuMTAzNy8xMDgyLTk4OVguMTEuMS41NC5zdXBwCgogIE4gPC0gbGVuZ3RoKHgpCiAgcmVzIDwtICh4LWxvd2VyKS8odXBwZXIgLSBsb3dlcikKICByZXMgPC0gKHJlcyooTi0xKSArIC41KS9OCgogIHJldHVybihhcy52ZWN0b3IocmVzKSkKfQojIAojIGZpdC5iZXRhUjwtIGJybShtZWFuIH4gY29uZGl0aW9uICogcGhhc2UgKyAoMXx3b3JrZXJJZCksIAojICAgICAgICAgICAgICAgIGRhdGE9ZF9zY29yZWQgJT4lIG11dGF0ZShtZWFuID0gcmVzY2FsZV9iZXRhKG1lYW4sLTMsMykpLAojICAgICAgICAgICAgICAgIGZhbWlseT1CZXRhKCksCiMgICAgICAgICAgICAgICAgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAuODUpLAojICAgICAgICAgICAgICAgIGNvcmVzID0gcGFyYWxsZWw6OmRldGVjdENvcmVzKCksCiMgICAgICAgICAgICAgICAgaXRlciA9IDIwMDApCiMgCiMgc3VtbWFyeShmaXQuYmV0YVIpCmBgYAoKIyMjIEJldGEgcmVncmVzc3Rpb246IHBvc3R0ZXN0CgpMZXQncyBsb29rIGF0IHByZWRpY3RpbmcgcG9zdC10ZXN0IHdpdGggYmV0YSByZWdyZXNzaW9uLiBIZXJlIHRoZXJlJ3Mgbm8gZXZpZGVuY2UgYXQgYWxsIGZvciBhbnkgcG9zaXRpdmUgZWZmZWN0IG9mIGRpc2Vhc2VSaXNrIChpbiBmYWN0IHRoZSBjb2VmZmljaWVudCBpcyBuZWdhdGl2ZSksIGJ1dCB0aGVyZSBpcyBldmlkZW5jZSBvZiAqKkJBQ0tGSVJFKiogZm9yIHRoZSBhdXRpc20gY29ycmVjdGlvbiBjb25kaXRpb24uCgpgYGB7cn0KbGlicmFyeShiZXRhcmVnKQoKY29udHJhc3RzKGQyJGNvbmRpdGlvbikgPC0gY2JpbmQoZGlzZWFzZVJpc2sgPSBjKDAsIDEpKQoKZml0LmJldGFJbnQgPC0gYmV0YXJlZyhwb3N0IH4gc2NhbGUocHJlKSAqIGNvbmRpdGlvbiwKICAgICAgICAgICAgICAgICAgICBkYXRhPWQyICU+JSBtdXRhdGUocG9zdD1yZXNjYWxlX2JldGEocG9zdCwtMywzKSkpCgpzdW1tYXJ5KGZpdC5iZXRhSW50KQpgYGAKCkFJQyBmYXZvcnMgdGhlIGJldGEgcmVncmVzc2lvbiBvdmVyIHRoZSBsaW5lYXIgcmVncmVzc2lvbiBzdHJvbmdseS4KCmBgYHtyfQpBSUMobG0ocG9zdCB+IHByZSAqIGNvbmRpdGlvbiwgZGF0YT1kMiAlPiUgbXV0YXRlKHBvc3Q9cmVzY2FsZV9iZXRhKHBvc3QsLTMsMykpKSkKQUlDKGZpdC5iZXRhSW50KQpgYGAKCmBgYHtyfQoKZml0Lm9sc1NjYWxlZCA8LSBsbShwb3N0IH4gc2NhbGUocHJlKSAqIGNvbmRpdGlvbiwgZGF0YT1kMiAlPiUgbXV0YXRlKHBvc3Q9cmVzY2FsZV9iZXRhKHBvc3QsLTMsMykpKQoKZDIgJT4lIAogIG11dGF0ZShwb3N0PXJlc2NhbGVfYmV0YShwb3N0LC0zLDMpKSAlPiUKICBzZWxlY3QoY29uZGl0aW9uLCBwcmUsIHBvc3QpICU+JQogIGJpbmRfY29scyhwcmVkaWN0KGZpdC5iZXRhSW50KSAlPiUgYXNfdGliYmxlKCkpICU+JQogIHJlbmFtZShwcmVkaWN0aW9uQmV0YT12YWx1ZSkgJT4lCiAgYmluZF9jb2xzKHByZWRpY3QoZml0Lm9sc1NjYWxlZCkgJT4lIGFzX3RpYmJsZSgpKSAlPiUKICByZW5hbWUocHJlZGljdGlvbk9MUz12YWx1ZSkgJT4lCgpnZ3Bsb3QoYWVzKHggPSBwcmUsIHkgPSBwb3N0LCBjb2xvcj1jb25kaXRpb24pKSArCiAgZ2VvbV9qaXR0ZXIoaGVpZ2h0PS4xLCB3aWR0aD0uMDUsIGFscGhhPS44LCBzaGFwZT0xKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gcHJlZGljdGlvbkJldGEsIGxpbmV0eXBlPSJCZXRhIikpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBwcmVkaWN0aW9uT0xTLCBsaW5ldHlwZT0iT0xTIikpICsKICAjIGdlb21fbGluZShhZXMoeSA9IHByZWRpY3QoZml0Lm9scywgdmFjY1cpLAogICMgICAgICAgICAgICAgICBjb2xvdXIgPSAiT0xTIiwgbGluZXR5cGUgPSAiT0xTIikpICsKICAjIHNjYWxlX2NvbG91cl9tYW51YWwoIiIsIHZhbHVlcyA9IGMoInJlZCIsICJibHVlIikpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwoIiIsIHZhbHVlcyA9IGMoInNvbGlkIiwgImRhc2hlZCIpKSArCiAgdGhlbWVfYncoKQpgYGAKCg==